package com.biconn.bigdata.jstrom.question.and.answer.bolt;

import java.util.Map;

import org.apache.avro.generic.GenericRecord;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.alibaba.fastjson.JSONObject;
import com.biconn.bigdata.common.util.StringTools;
import com.biconn.bigdata.jstrom.util.Constants;
import com.biconn.bigdata.jstrom.util.RegularExpress;
import backtype.storm.task.OutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.IRichBolt;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Tuple;
import backtype.storm.tuple.Values;

public class QuestionAndAnswerBolt implements IRichBolt{
	private Logger logger = LoggerFactory.getLogger(getClass());
	// 一定要 生成 一个 serialVersionUID，因为这些class 都是要经过序列化的
	private static final long serialVersionUID = 8740926838799779884L;
	
	private OutputCollector collector;
	//private String avro_str ;
	//private AvroUtil avroUtil ;
	 Map<String,String> map = RegularExpress.loadXml();
	
	//private KafkaProducer<String, String> kafkaProducer;

	public QuestionAndAnswerBolt() {
		logger.info("QuestionAndAnswerBolt:**********************************");
	}

	/**
	 * prepare 在这里仅仅是启动了一个文件写的定时线程，每2秒将结果写到文件中，并清空map.
	 */
	@Override
	public void prepare(Map stormConf, TopologyContext context, OutputCollector collector) {
		this.collector = collector;

	}
	
	
	/**
	 * 
	 * <p>Title: execute</p>   
	 * <p>Description: </p>   
	 * @param input   
	 * @see backtype.storm.task.IBolt#execute(backtype.storm.tuple.Tuple)
	 */
	@Override
	public void execute(Tuple input) {
		
		
		try {
			GenericRecord genericrecord = (GenericRecord)input.getValueByField(Constants.SCRAPY_QUESTION_AND_ANSWER_TOPIC_JSTORM_FIELD);
			String ask_content = StringUtils.replaceAll(StringTools.mkobjectToString(genericrecord.get("ask_content")), "[`~!@#$%^&*()+=|{}':;',\\\\[\\\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、r n t？]", "");
			String answers =  StringTools.mkobjectToString(genericrecord.get("answers"));
			if(!StringTools.isBlank(answers)) {
				String arrays [] = StringTools.mkSplit(answers, "#$");
				StringBuffer sb = new StringBuffer(128);
				for(String str : arrays) {
					if(!StringTools.isBlank(str)) {
						JSONObject json = (JSONObject)JSONObject.parse(str);
						String afterstr = StringUtils.replaceAll(json.toString(),"as_","");
						//System.out.println("afterstr:"+afterstr);
						JSONObject newJsonObject = (JSONObject)JSONObject.parse(afterstr);
						//对立面的doctor_info进行处理
						String doc_info = StringTools.mkobjectToString(newJsonObject.get("doctor_info"));
						if(!StringTools.isBlank(doc_info)) {
							String strs [] =  StringTools.mkSplit(doc_info, " ");
							//需要判断数组长度
							if(strs.length >=3 ) {
								String doctorinfo = StringTools.mkString(strs[0]);
								String hospital = StringTools.mkString(strs[1]);
								String level = StringTools.mkString(strs[2]);
								//String introduction = StringTools.mkString(strs[4]);
								newJsonObject.put("doctorinfo", doctorinfo);
								newJsonObject.put("hospital", hospital);
								newJsonObject.put("level", level);
								
							}else {
								put(newJsonObject,doc_info);
//								newJsonObject.put("doctorinfo", doc_info);
//								newJsonObject.put("hospital", "");
//								newJsonObject.put("level", "");
							}
						}else {
							put(newJsonObject,doc_info);
//							newJsonObject.put("doctorinfo", doc_info);
//							newJsonObject.put("hospital", "");
//							newJsonObject.put("level", "");
						}
						
						newJsonObject.remove("doctor_info");
						//System.out.println("newJsonObject.toString()"+newJsonObject.toString());
						sb.append(newJsonObject.toString()).append("#$");
						

					}
								
				}
				genericrecord.put("ask_content", StringTools.mkString(ask_content));
				genericrecord.put("answers", sb.toString());
				sb = null;
			}
			collector.emit(new Values(genericrecord));
			
		
		} catch (Exception e) {
			
			e.printStackTrace();
		}
	}
	
	private void put(JSONObject newJsonObject,String doc_info) {
		newJsonObject.put("doctorinfo", StringUtils.replaceAll(doc_info, "[`~!@#$%^&*()+=|{}':;',\\\\[\\\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、r n t？ ]", ""));
		newJsonObject.put("hospital", "");
		newJsonObject.put("level", "");
	}
	
	/**
	 * Topology 被 shutdown时会被触发的动作，我们可以用来做一些清理工作
	 */
	@Override
	public void cleanup() {
		//System.out.println("*******************public void cleanup()");
	}

	@Override
	public void declareOutputFields(OutputFieldsDeclarer declarer) {
		declarer.declare(new Fields(Constants.JSTORM_QUESTION_AND_ANSWER_COLLECTION));
		
	}

	@Override
	public Map<String, Object> getComponentConfiguration() {
		// TODO Auto-generated method stub
		return null;
	}
	
   public static void main(String[] args) {
//	 String str =  StringUtils.replaceAll("{\r\n" + 
//	 		"	\"question\": \"{\\\"save_time\\\": \\\"2018-08-13 14:08:57\\\", \\\"source_web\\\": \\\"寻医问药\\\", \\\"ask_link\\\": \\\"http://club.xywy.com/question/20180812/162134827.htm\\\", \\\"ask_title\\\": \\\"看子宫内膜炎疗效好的医院\\\", \\\"ask_content\\\": \\\"郑州看子宫内膜炎最好的医院得子宫内膜炎的原因我想问一下得子宫内膜炎的原因月经两个月没来了去医院照B超医生说子宫偏小然后我又去了省妇幼医院医生拿了一些药品催月经来可要吃完了还没来我该不该也试下吃调经促孕丸呢郑州看子宫内膜炎最好的医院\\\", \\\"ask_time\\\": \\\"2018-08-12 00:06:18\\\", \\\"ask_sex\\\": \\\"\\\", \\\"ask_age\\\": \\\"\\\", \\\"ask_department\\\": \\\"妇科炎症\\\", \\\"ask_id\\\": \\\"5ced09329ebf11e8b291000c290ff4bd\\\", \\\"answers\\\": \\\"\\\"}\",\r\n" + 
//	 		"	\"answers\": [{\r\n" + 
//	 		"		\"as_ask_order\": \"0\",\r\n" + 
//	 		"		\"level\": \"\",\r\n" + 
//	 		"		\"as_doctor_info\": \"n驻站医生3n|nrn                专长：全科n\",\r\n" + 
//	 		"		\"doctorinfo\": \"n驻站医生3n|nrn                专长：全科n\",\r\n" + 
//	 		"		\"as_spider_name\": \"as_spider_name\",\r\n" + 
//	 		"		\"as_doctor_answer\": \"您好！子宫内膜炎的症状：有轻度发热、下腹疼痛、白带增多等。白带有时为血性，如果系厌氧菌引起的，则分泌物恶臭。子宫内膜炎的原因是因为人流和分娩对子宫造成的伤害。以后术后没有注意伤口的愈合而引发的子宫感染炎症。郑州看子宫内膜炎最好的医院？您好！建议您到当地专业不孕不育医院进行检查，明确一下病因，有针对性的进行治疗，以免错过最佳的治疗时机，使病情加重，祝您健康！\",\r\n" + 
//	 		"		\"as_doctor_time\": \"2018-08-12 00:07:21\",\r\n" + 
//	 		"		\"hospital\": \"\"\r\n" + 
//	 		"	}]\r\n" + 
//	 		"}", "as_", "");
	   String str = "n驻站医生1n|nrn                专长：全科n";
	   String ask_content = StringUtils.replaceAll(str, "[`~!@#$%^&*()+=|{}':;',\\\\[\\\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、r n t？ ]", "");
	 System.out.println(ask_content);
   }

}
